#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <stack>
using namespace std;
#define int long long
#define pii pair<int,int>



const int N = 100005;
int n, m, q;
int root[N], ls[N * 40], rs[N * 40], mi[N * 40];
int cnt;



int up(int p, int index, int l, int r) {
	int rt = ++cnt;
	ls[rt] = ls[p]; rs[rt] = rs[rt]; mi[rt] = mi[p];
	

}

void solve() {
	cin >> n >> m >> q;
		

	for (int i = 1,op,a,b; i <= q; i++) {
		cin >> op >> a;
		if (op == 1) {
			cin >> b;
			root[a] = up(root[a], b, 1, m);
		}
	}
}


signed main() {
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}

//set<string> st;
//int n;
//string s[100005];
//void solve() {
//	cin >> n;
//	for (int i = 1; i <= n; i++) {
//		cin >> s[i];
//	}
//	sort(s + 1, s + 1 + n, [&](string a, string b)->bool {return a.size() < b.size(); });
//	if (s[1].size() != 1) {
//		cout << 0 << '\n';
//		return;
//	}
//	int ans = 1;
//	for (int i = 1; i <= n; i++) {
//		if (s[i].size() > 1) {
//			int m = s[i].size();
//			bool ok = true;
//			for (int j = 1; j < m; j++) {
//				string pre = s[i].substr(0, j);
//				string suf = s[i].substr(j);
//				if (!st.count(pre) || !st.count(suf)) {
//					ok = false;
//					break;
//				}
//			}
//			if (ok) {
//				ans = max(ans, m);
//				st.insert(s[i]);
//			}
//		}
//		else {
//			st.insert(s[i]);
//		}
//	}
//	cout << ans << '\n';
//}
//

//void calc_next() {
//	nxt[1] = 0;
//	for (int i = 2, j = 0; i <= m; i++) {
//		while (j > 0 && b[i] != b[i + 1])j = nxt[j];
//		if (a[i] == a[j + 1])j++;
//		nxt[i] = j;
//	}
//}

//int n, m;
//int a[200005];
//pii pre[200005], suf[200005];
//int dp[200005];
//
//void solve() {
//	cin >> n;
//	for (int i = 1; i <= n; i++) {
//		cin >> a[i];
//	}
//	dp[1] = a[1];
//	for (int i = 2; i <= n; i++) {
//		dp[i] = max(dp[i - 1] + a[i], dp[i - 2]);
//	}
//	cout << dp[n] << '\n';
//}
//


//int a[N], ls[N * 30], rs[N * 30], sum[N * 30], root[N];
//int n, q, cnt;
//
//
//int build(int l, int r) {
//	int rt = ++cnt;
//	if (l == r) {
//		sum[rt] = 1;
//	}
//	else {
//		int m = (l + r) >> 1;
//		ls[rt] = build(l, m);
//		rs[rt] = build(m + 1, r);
//		sum[rt] = sum[ls[rt]] + sum[rs[rt]];
//	}
//	return rt;
//}
//
//void up(int& p, int q, int jl, int jr, int l, int r) {
//	if (!q)return;
//	if (jl <= l && r <= jr) {
//		p = q;
//		return;
//	}
//	int rt = ++cnt;
//	ls[rt] = ls[p]; rs[rt] = rs[p]; sum[rt] = sum[p];
//	p = rt;
//	int m = (l + r) >> 1;
//	if (jl <= m) up(ls[p], ls[q], jl, jr, l, m);
//	if (jr > m) up(rs[p], rs[q], jl, jr, m + 1, r);
//	sum[rt] = sum[ls[rt]] + sum[rs[rt]];
//}
//
//int qry(int p, int jl, int jr, int l, int r) {
//	if (!p)return 0;
//	if (jl <= l && r <= jr) {
//		return sum[p];
//	}
//	int m = (l + r) >> 1, ans = 0;
//	if (jl <= m)ans += qry(ls[p], jl, jr, l, m);
//	if (jr > m)ans += qry(rs[p], jl, jr, m + 1, r);
//	return ans;
//}
//
//void solve() {
//	cin >> n >> q;
//	root[0] = build(1, n);
//	for (int i = 1, op, jl, jr, x; i <= q; i++) {
//		cin >> op >> jl >> jr;
//		if (op == 1) {
//			cin >> x;
//			up(root[x + 1], root[x], jl, jr, 1, n);
//		}
//		else {
//			int l = 0, r = i, m;
//			while (l < r) {
//				m = (l + r + 1) >> 1;
//				if (qry(root[m], jl, jr, 1, n))l = m;
//				else r = m - 1;
//			}
//			cout << l << '\n';
//		}
//	}
//}